// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/material.dart';
import 'package:flutter_api_samples/material/dropdown_menu/dropdown_menu.1.dart' as example;
import 'package:flutter_test/flutter_test.dart';

void main() {
  testWidgets('The DropdownMenu should display a menu with the list of entries the user can select', (WidgetTester tester) async {
    await tester.pumpWidget(
      const example.DropdownMenuApp(),
    );

    expect(find.widgetWithText(TextField, 'One'), findsOne);
    final Finder menu = find.byType(DropdownMenu<String>);
    expect(menu, findsOne);

    Finder findMenuItem(String label) {
      return find.widgetWithText(MenuItemButton, label).last;
    }

    await tester.tap(menu);
    await tester.pumpAndSettle();
    expect(findMenuItem('One'), findsOne);
    expect(findMenuItem('Two'), findsOne);
    expect(findMenuItem('Three'), findsOne);
    expect(findMenuItem('Four'), findsOne);

    await tester.tap(findMenuItem('Two'));

    // The DropdownMenu's onSelected callback is delayed
    // with SchedulerBinding.instance.addPostFrameCallback
    // to give the focus a chance to return to where it was
    // before the menu appeared. The pumpAndSettle()
    // give the callback a chance to run.
    await tester.pumpAndSettle();

    expect(find.widgetWithText(TextField, 'Two'), findsOne);
  });

  testWidgets('DropdownMenu has focus when tapping on the text field', (WidgetTester tester) async {
    await tester.pumpWidget(
      const example.DropdownMenuApp(),
    );

    // Make sure the dropdown menus are there.
    final Finder menu = find.byType(DropdownMenu<String>);
    expect(menu, findsOne);

    // Tap on the menu and make sure it is focused.
    await tester.tap(menu);
    await tester.pumpAndSettle();
    expect(FocusScope.of(tester.element(menu)).hasFocus, isTrue);
  });
}
